#include "utils_msg.h"
#include <map>
#include <mutex>
#include <string>
#include <condition_variable>
#include <chrono>

namespace {
std::mutex g_mutex;
std::condition_variable g_cv;
std::map<std::string, bool> g_messages;
} // namespace

int base_wait_message(const char *msg, int timeout_ms)
{
    if (msg == nullptr) {
        return -2;
    }

    std::unique_lock<std::mutex> lock(g_mutex);
    std::string message(msg);

    // 如果消息已经存在，直接返回成功
    if (g_messages[message]) {
        g_messages[message] = false; // 消费消息
        return 0;
    }

    // 等待消息
    if (timeout_ms == 0) {
        // 永久等待
        g_cv.wait(lock, [&message]() { return g_messages[message]; });
        g_messages[message] = false; // 消费消息
        return 0;
    } else {
        // 带超时的等待
        auto result =
            g_cv.wait_for(lock, std::chrono::milliseconds(timeout_ms), [&message]() { return g_messages[message]; });

        if (result) {
            g_messages[message] = false; // 消费消息
            return 0;
        }
        return -1; // 超时
    }
}

int base_send_message(const char *msg)
{
    if (msg == nullptr) {
        return -2;
    }

    std::lock_guard<std::mutex> lock(g_mutex);
    std::string message(msg);
    g_messages[message] = true;
    g_cv.notify_all();
    return 0;
}